:- import set_unify/2 from set_unify.
:- import numbervars/1 from num_vars.
:- import normalize_result/2 from can_mono.

test :- tp, fail.
test :- writeln('=========== Result is ================'), nl, show_facts.

unify_sets([],[]).
unify_sets([A|As],[B|Bs]) :- 
       set_unify(A,B), unify_sets(As,Bs).


%---------------- Transformed program ----------------------

queens__1(_1177668,_1177676) :- 
        [_1177524] = _1177684, [_1177568] = _1177692, 
        perm([_1177524],[_1177568]),
        safe([_1177568]),
        normalize_result([_1177684,_1177692],
                         [_1177668,_1177676]).
perm__1(_1177136,_1177144) :- 
        [list] = _1177152, [list] = _1177160, 
        normalize_result([_1177152,_1177160],
                          [_1177136,_1177144]).
perm__1(_1177992,_1178000) :- 
        [list,_1177008] = _1178008, [list,_1177900] = _1178016, 
        delete([_1177812],[list,_1177008],[_1177884]),
        perm([_1177884],[_1177900]),
        normalize_result([_1178008,_1178016],
                         [_1177992,_1178000]).
delete__1(_1177332,_1177340,_1177348) :- 
        [_1177228] = _1177356, [list,_1177268] = _1177364, [_1177268] = _1177372, 
        normalize_result([_1177356,_1177364,_1177372],
                          [_1177332,_1177340,_1177348]).
delete__1(_1177788,_1177796,_1177804) :- 
        [_1177664] = _1177812, [list,_1177680] = _1177820, [list,_1177696] = _1177828, 
        delete([_1177664],[_1177680],[_1177696]),
        normalize_result([_1177812,_1177820,_1177828],
                         [_1177788,_1177796,_1177804]).
safe__1(_1177044) :- 
        [list] = _1177052, 
        normalize_result([_1177052],
                          [_1177044]).
safe__1(_1177672) :- 
        [list,_1177592] = _1177680, 
        noattack([_1177528],[_1177592],[num]),
        safe([_1177592]),
        normalize_result([_1177680],
                         [_1177672]).
noattack__1(_1177276,_1177284,_1177292) :- 
        [_1177180] = _1177300, [list] = _1177308, [_1177212] = _1177316, 
        normalize_result([_1177300,_1177308,_1177316],
                          [_1177276,_1177284,_1177292]).
noattack__1(_1179132,_1179140,_1179148) :- 
        [_1178960] = _1179156, [list,_1178976] = _1179164, [_1178900] = _1179172, 
        'my =\\='([_1178960],[_1178768]),
        'my =\\='([_1178960],[[_1178768],[_1178900]]),
        'my =\\='([_1178768],[[_1178960],[_1178900]]),
        'my is'([_1178992],[[_1178900],[num]]),
        noattack([_1178960],[_1178976],[_1178992]),
        normalize_result([_1179156,_1179164,_1179172],
                         [_1179132,_1179140,_1179148]).

%---------------- Definitions of tabled preds --------------

:- table noattack__1/3.
:- table safe__1/1.
:- table delete__1/3.
:- table perm__1/2.
:- table queens__1/2.

noattack(_1176924,_1176932,_1176940) :- 
        noattack__1(_1176948,_1176956,_1176964),
        unify_sets([_1176924,_1176932,_1176940], [_1176948,_1176956,_1176964]).
safe(_1176924) :- 
        safe__1(_1176932),
        unify_sets([_1176924], [_1176932]).
delete(_1176924,_1176932,_1176940) :- 
        delete__1(_1176948,_1176956,_1176964),
        unify_sets([_1176924,_1176932,_1176940], [_1176948,_1176956,_1176964]).
perm(_1176924,_1176932) :- 
        perm__1(_1176940,_1176948),
        unify_sets([_1176924,_1176932], [_1176940,_1176948]).
queens(_1176924,_1176932) :- 
        queens__1(_1176940,_1176948),
        unify_sets([_1176924,_1176932], [_1176940,_1176948]).

%---------------- Tp ---------------------------------------

tp :- noattack__1(_1176928,_1176936,_1176944), fail.
tp :- safe__1(_1176928), fail.
tp :- delete__1(_1176928,_1176936,_1176944), fail.
tp :- perm__1(_1176928,_1176936), fail.
tp :- queens__1(_1176928,_1176936), fail.
tp.


%---------------- Builtin Preds ----------------------------

'my ='(X1,X2) :- 'my =_1'(Y1,Y2), unify_sets([X1,X2],[Y1,Y2]).
'my \\=='(X1,X2) :- 'my \\==__1'(Y1,Y2), unify_sets([X1,X2],[Y1,Y2]).
'my is'(X1,X2) :- 'my is__1'(Y1,Y2), unify_sets([X1,X2],[Y1,Y2]).
'my <'([num],[num]).
'my >'([num],[num]).
'my >='([num],[num]).
'my =<'([num],[num]).
'my =:='([num],[num]).
'my =\\='(X1,X2) :- 'my =\\=__1'(Y1,Y2), unify_sets([X1,X2],[Y1,Y2]).

'my =_1'(X,X).
'my \\==__1'(_,_).
'my is__1'(num,num).
'my =\\=__1'(num,num).


%---------------- Show Result ------------------------------

show_facts :- noattack__1(_1176924,_1176932,_1176940),
              numbervars([_1176924,_1176932,_1176940]),
              write(noattack(_1176924,_1176932,_1176940)), nl, fail.
show_facts :- safe__1(_1176924),
              numbervars([_1176924]),
              write(safe(_1176924)), nl, fail.
show_facts :- delete__1(_1176924,_1176932,_1176940),
              numbervars([_1176924,_1176932,_1176940]),
              write(delete(_1176924,_1176932,_1176940)), nl, fail.
show_facts :- perm__1(_1176924,_1176932),
              numbervars([_1176924,_1176932]),
              write(perm(_1176924,_1176932)), nl, fail.
show_facts :- queens__1(_1176924,_1176932),
              numbervars([_1176924,_1176932]),
              write(queens(_1176924,_1176932)), nl, fail.
show_facts.
